#pragma once

template <typename T>
class Handle {
 private:
  std::shared_ptr<T> ptr;

 public:
  Handle(std::shared_ptr<T> p) : ptr(p) {}

  T* operator->() const { return ptr.get(); }
  T& operator*() const { return *ptr; }

  bool is_valid() const { return static_cast<bool>(ptr); }
};

template <typename T>
class Assets {
 private:
  std::unordered_map<std::string, std::shared_ptr<T>> resources;

 public:
  // 插入资源并返回一个 Handle
  template <typename... Args>
  Handle<T> insert(const std::string& id, Args&&... args) {
    auto resource = std::make_shared<T>(std::forward<Args>(args)...);
    resources[id] = resource;
    return Handle<T>(resource);
  }

  // 通过 ID 获取资源
  Handle<T> get(const std::string& id) {
    if (auto it = resources.find(id); it != resources.end()) {
      return Handle<T>(it->second);
    }
    return Handle<T>(nullptr);  // 返回无效的 Handle
  }

  // 删除资源
  void remove(const std::string& id) { resources.erase(id); }

  // 清空所有资源
  void clear() { resources.clear(); }
};